我用Python写了一个服务器监控脚本,CPU、内存、磁盘超阈值自动告警

作为一个独立开发者或者站长,手头难免有几台服务器。有时候负载突然飙升,磁盘空间被日志撑爆,如果没能及时发现,轻则服务响应变慢,重则直接宕机。以前我都是隔三差五手动 SSH 上去敲 topdf -h,后来觉得太麻烦,干脆自己写了个监控脚本,每分钟采集一次数据,超过阈值就通过钉钉机器人发告警。今天就把这个脚本分享出来,代码完整可运行,注释也写得很详细,希望能帮到你。

这个脚本是用 Python 写的,依赖 psutil 库来获取系统信息,用 requests 发送 webhook 告警。你完全可以把它部署在任何 Linux 服务器上(当然 Windows 也能跑,但监控指标需要微调)。

脚本能做什么?

  • 每分钟记录 CPU 使用率、内存使用率、磁盘使用率
  • 当任意指标超过设定的阈值时,通过钉钉/企业微信/自定义 webhook 发送告警通知
  • 默认将记录写入日志文件,方便回溯
  • 轻量、易扩展,你可以轻松改成邮件告警或者 Telegram 通知

准备工作

确保服务器上有 Python 3.6+,然后安装依赖:

pip install psutil requests

如果你还没有自己的服务器,可以考虑性价比高的云服务商,比如 雨云服务器(优惠码:aabh),新用户有不错的折扣,用来跑脚本正合适。

完整脚本代码

下面直接上代码。我把它命名为 monitor.py,你复制到服务器上,修改开头的配置项就能用。

#!/usr/bin/env python3

-- coding: utf-8 --

"""
服务器监控脚本 - 每分钟采集CPU、内存、磁盘使用率,超阈值时通过webhook告警。
Author: Your Name
Date: 2025-03-23
"""
import os
import time
import logging
import psutil
import requests
import json
from datetime import datetime

====== 配置区域 ======

CPU_THRESHOLD = 80 # CPU使用率告警阈值 (%)
MEM_THRESHOLD = 80 # 内存使用率告警阈值 (%)
DISK_THRESHOLD = 90 # 磁盘使用率告警阈值 (%)
INTERVAL = 60 # 采集间隔 (秒)
LOG_FILE = "/var/log/server_monitor.log" # 日志文件路径
WEBHOOK_URL = "https://oapi.dingtalk.com/robot/send?access_token=YOUR_TOKEN" # 钉钉机器人webhook

如果不用钉钉,可以改成其他webhook,或者设为 None 则只记录日志不发送告警。

======================

设置日志

logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(message)s",
handlers=[
logging.FileHandler(LOG_FILE),
logging.StreamHandler() # 同时在终端输出
]
)
logger = logging.getLogger(__name__)
def send_alert(message):
"""通过webhook发送告警消息,这里以钉钉为例"""
if not WEBHOOK_URL:
logger.warning("未配置webhook,跳过告警发送")
return
try:
payload = {
"msgtype": "text",
"text": {
"content": f"【服务器监控告警】\n{message}"
}
}
headers = {"Content-Type": "application/json"}
resp = requests.post(WEBHOOK_URL, data=json.dumps(payload), headers=headers, timeout=10)
if resp.status_code == 200:
logger.info("告警发送成功")
else:
logger.error(f"告警发送失败: {resp.text}")
except Exception as e:
logger.error(f"发送告警异常: {e}")
def get_system_info():
"""采集系统信息,返回包含CPU、内存、磁盘使用率的字典"""
info = {}

CPU使用率(取5秒内的平均值,避免瞬时波动)

info['cpu_percent'] = psutil.cpu_percent(interval=5)

内存使用率

info['memory_percent'] = psutil.virtual_memory().percent

磁盘使用率(只检查根分区,可根据需要修改)

info['disk_percent'] = psutil.disk_usage('/').percent
return info
def check_thresholds(info):
"""检查各项指标是否超过阈值,返回告警消息列表"""
alerts = []
if info['cpu_percent'] > CPU_THRESHOLD:
alerts.append(f"CPU使用率: {info['cpu_percent']}% (阈值 {CPU_THRESHOLD}%)")
if info['memory_percent'] > MEM_THRESHOLD:
alerts.append(f"内存使用率: {info['memory_percent']}% (阈值 {MEM_THRESHOLD}%)")
if info['disk_percent'] > DISK_THRESHOLD:
alerts.append(f"磁盘使用率: {info['disk_percent']}% (阈值 {DISK_THRESHOLD}%)")
return alerts
def main():
logger.info("服务器监控脚本启动")
while True:
try:
info = get_system_info()

记录日志

log_msg = (f"CPU: {info['cpu_percent']}% | "
f"内存: {info['memory_percent']}% | "
f"磁盘: {info['disk_percent']}%")
logger.info(log_msg)

检查阈值

alerts = check_thresholds(info)
if alerts:
alert_msg = "\n".join(alerts)
logger.warning(f"触发告警:\n{alert_msg}")
send_alert(alert_msg)
else:
logger.debug("一切正常")
except Exception as e:
logger.error(f"采集异常: {e}")
time.sleep(INTERVAL)
if name == "__main__":
main()

如何使用

将代码保存为 monitor.py,然后修改配置:

  • 阈值:根据你的服务器规格调整 CPU_THRESHOLDMEM_THRESHOLDDISK_THRESHOLD
  • 告警方式:脚本默认通过钉钉机器人发送消息。你需要先在钉钉群添加一个自定义机器人,获取 Webhook URL,替换掉 WEBHOOK_URL。如果你用企业微信或其他,修改 send_alert 函数即可。
  • 日志路径:确保 LOG_FILE 指向的目录存在且有写入权限。

然后用 Python 直接运行:

python3 monitor.py

建议使用 nohupsystemd 将其设为后台服务,保证持续运行。例如用 nohup:

nohup python3 monitor.py &

用 systemd 管理脚本(推荐)

为了让监控脚本开机自启并在崩溃后自动重启,最好写成 systemd 服务。新建一个服务文件:

sudo vim /etc/systemd/system/server-monitor.service

写入以下内容(注意路径替换):

[Unit]
Description=Server Monitor Script
After=network.target
[Service]
ExecStart=/usr/bin/python3 /path/to/monitor.py
Restart=always
User=root
[Install]
WantedBy=multi-user.target

然后执行:

sudo systemctl daemon-reload
sudo systemctl enable server-monitor
sudo systemctl start server-monitor

这样脚本就会在后台稳定运行,再也不怕意外中断了。

一点扩展想法

这个脚本虽然简单,但已经能满足大部分个人站长的需求。你可以在此基础上增加更多指标,比如网络流量、进程数、磁盘 I/O;也可以改成邮件告警(用 smtplib)或者 Telegram Bot。如果你有多个服务器,可以搭建一个中心化的告警聚合服务,但那是后话了。

另外,如果你不想自己维护监控,也可以直接使用云服务商提供的监控告警功能,比如 雨云服务器 就自带基本的监控面板,不过自己写脚本的好处是完全可控,而且能自定义告警内容。

总结

自己写一个监控脚本并不复杂,核心就是定期采集数据、比较阈值、发送通知。这个 Python 脚本只有不到 100 行,但已经能帮你省下不少手动检查的时间。如果你正被服务器告警困扰,不妨试试这个方案,然后根据自己的需求改一改。如果你有更好的想法,也欢迎留言交流。

最后提醒一句:别忘了定期查看日志文件,确认监控本身在正常工作——你懂的,监控脚本也可能挂掉,所以最好再加一层监控(或者用 systemd 自动重启)。好了,快去试试吧!

评论区: